package com.robertux.leaderboard.util;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import com.robertux.leaderboard.beans.entities.Meta;
import com.robertux.leaderboard.beans.entities.ProgresoMeta;
import com.robertux.leaderboard.beans.entities.Usuario;
import com.robertux.leaderboard.util.gestoresModelos.GestorProgresos;
import com.robertux.leaderboard.util.gestoresModelos.GestorUsuarios;

public class ProgresosFileContentHandler extends FileContentHandler {
	private GestorProgresos gPgr;

	public ProgresosFileContentHandler() {
		super("/Leaderboard/consultas/progresoMetasSucursal.html", 
				new String[]{"Mes", "Venta", "CodEmpleado", "NombreMeta", "ValorMeta", "No usar"});
		
		this.gPgr = new GestorProgresos();
	}

	@Override
	public String[] handleFileContent(String[][] fileContent, String[] discardedRows, String[] mappedColumns) {
		String[] results = new String[fileContent.length];
		
		List<String> lstDiscardedRows = Arrays.asList(discardedRows);
		
		for(int i=0; i<fileContent.length; i++) {
			String result = "";
			if(!lstDiscardedRows.contains(String.valueOf(i))) {
				try {
					ProgresoMeta progreso = this.createProgreso(fileContent[i], mappedColumns);
					if(progreso != null) {						
						this.gPgr.actualizar(progreso);
					} else {
						result = "ERROR - No se pudo construir un progreso a partir de los datos ingresados";
					}
				} catch (Exception e) {
					this.logger.error("Error tratando de construir progreso con las columnas " + Arrays.toString(fileContent[i]) + ": " + e.getMessage(), e);
					result = "ERROR - Error tratando de insertar progreso: " + e.getMessage();
				}
			}
			results[i] = result;
		}
		
		return results;
	}
	
	private ProgresoMeta createProgreso(String[] contentRow, String[] mappedColumns) {
		ProgresoMeta progreso = new ProgresoMeta();
		Usuario usr = null;
		Meta mt = null;
		Calendar calProgreso = new GregorianCalendar();
		
		List<String> lstColumns = Arrays.asList(mappedColumns);
		int index = 0;
		
		index = lstColumns.indexOf("CodEmpleado");
		if(index >= 0 && index < contentRow.length) {
			usr = new GestorUsuarios().getUsuarioByIdEmpleado(contentRow[index]);
		}
		
		if(usr == null) {
			return null;
		}
		
		index = lstColumns.indexOf("NombreMeta");
		if(index >= 0 && index < contentRow.length) {
			for(Meta m: usr.getMetas()) {
				if(m.getNombre().equalsIgnoreCase(contentRow[index])) {
					mt = m;
					break;
				}
			}
		}
		
		if(mt == null) {
			return null;
		}
		
		index = lstColumns.indexOf("Mes");
		if(index >= 0 && index < contentRow.length) {
			calProgreso.set(Calendar.MONTH, Integer.parseInt(contentRow[index]) - 1);
		}
		
		index = lstColumns.indexOf("Venta");
		if(index >= 0 && index < contentRow.length) {
			progreso.setVentas(new BigDecimal(contentRow[index]));
		}
		
		mt.addProgresoMeta(progreso);
		progreso.setEstado("A");
		progreso.setFecha(calProgreso.getTime());
		progreso.setUltimaActualizacion(new Date());
		progreso.setValor(new BigDecimal((progreso.getVentas().doubleValue() / progreso.getMeta().getValor().doubleValue()) * 100));
		
		this.logger.debug("Progreso construido: " + progreso);
		return progreso;
	}

}
